package com.cq.designPattern.stateModel;

/**
 * 拥有状态对象，且可以完成状态间的转换 [状态的改变/切换 在环境类中实现]
 */
public class Context {
    //维护一个抽象状态的引用
    private State state;

    /**
     * 私有方法，目的是 让环境的状态由系统环境自身来控制/切换,外部使用者无需关心环境内部的状态
     * @param state
     */
    private void setState(State state) {
        this.state = state;
    }

    /**
     * 模拟手机的话费属性
     *
     * 1.当bill>=0时，状态正常，能拨打电话
     * 2.当bill<0时，状态异常，不能拨打电话
     */
    private double bill;

    public double getBill() {
        return bill;
    }

    public void setBill(double bill) {
        this.bill = bill;
    }

    /**
     * 环境处理函数，调用状态实例行为完成业务逻辑
     * 根据不同实例状态引用，在不同状态下处理不同行为
     */
    public void handle(){
        checkState();
        state.behavior();
    }

    private void checkState() {
        if(bill>=0){
            setState(new ConCreteStateA());
        }else {
            setState(new ConcreteStateB());
        }
    }
}
